package mytrain.kirayous.config;

import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

@Configuration
public class swaggerConfiguration {

    /*
    * 创建Docket类型的对象，并且为spring容器所用
    * docket是swagger文档的全局配置对象，选择swagger2进行配置
    * */
    @Bean
    Docket getDocket()
    {
        Docket docket=new Docket(DocumentationType.SWAGGER_2);

        ApiInfo apiInfo = new ApiInfoBuilder()//用builder构建器构建，用于配置api开发文档的信息
                .contact(new Contact("KiraYous-开发文档", //文档开发的名称
                        "http://www.baidu.com", //一般为企业官方网站
                        "1449685718@qq.com"))//开发者的email

                .title("开发api文档的标题")
                .description("具体描述")
                .version("1.0")
                .build();

        docket.apiInfo(apiInfo);

        docket=docket
                .select()//返回ApiSelectBuilder。用于构建选择器的，扫描某个包的注解
                .apis( Predicates.not(//Predicates.not指取反操作，true->false,false-true
                        RequestHandlerSelectors.withMethodAnnotation(myAnnotationSwagger.class)//这里指当方法上面有这个注解的时候，返回true
                        )//这个作用是通过以下设置扫描的mytrain。kirayous.controller包下面的类，看是否有带myAnnotationSwagger注解修饰，如果有，则不生成api文档，因为取反操作
                )
                .apis(RequestHandlerSelectors.basePackage("mytrain.kirayous.controller"))//类似于断言，默认扫描的是启动类里面的包包括子包,如果选择的是某个包，那么会扫描包括该包以及子包
                .paths(Predicates.or(
                        PathSelectors.regex("/test/.*"),//这个是用来配置某个访问路径上的controller，可以使用正则表达，此处代表的是访问路径为test下面的所有路径都可以做出api文档
                        PathSelectors.regex("/test1/.*")//注意一个点和一个星而不是单纯一个星
                ))
                .build();//重新构建docket对象，里面的参数配置已经改变
        return docket;
    }
}
